package net.sf.nlp.segment;

import java.util.List;

public class Segment 
{
	private static final String DEFAULT_CORE_DICT = Dictionary.DICTIONARY_PATH + "coreDict.dct";
	private static final String DEFAULT_RELATION_DICT = Dictionary.DICTIONARY_PATH + "biGramDict.dct";
	private static final String DEFAULT_PERSON_DICT = Dictionary.DICTIONARY_PATH + "nr.dct";
	private static final String DEFAULT_FOREIGN_PERSON_DICT = Dictionary.DICTIONARY_PATH + "tr.dct";
	private static final String DEFAULT_PLACE_DICT = Dictionary.DICTIONARY_PATH + "ns.dct";
	private static final String DEFAULT_CUSTOMER_DICT = Dictionary.DICTIONARY_PATH + "customerDict.txt";
	
	private static final String DEFAULT_PERSON_CONTEXT_STAT = Dictionary.DICTIONARY_PATH + "nr.ctx";
	private static final String DEFAULT_FOREIGN_PERSON_CONTEXT_STAT = Dictionary.DICTIONARY_PATH + "tr.ctx";
	private static final String DEFAULT_PLACE_CONTEXT_STAT = Dictionary.DICTIONARY_PATH + "ns.ctx";
	private static final String DEFAULT_LEXICAL_CONTEXT_STAT = Dictionary.DICTIONARY_PATH + "lexical.ctx";
		
	private static Dictionary coreDict = new Dictionary(DEFAULT_CORE_DICT, DEFAULT_CUSTOMER_DICT);
	private static Dictionary relationDict = new Dictionary(DEFAULT_RELATION_DICT);
	private static Dictionary personDict = new Dictionary(DEFAULT_PERSON_DICT);
	private static Dictionary foreignPersonDict = new Dictionary(DEFAULT_FOREIGN_PERSON_DICT);
	private static Dictionary placeDict = new Dictionary(DEFAULT_PLACE_DICT);
	
	private static ContextStat personContextStat = new ContextStat(DEFAULT_PERSON_CONTEXT_STAT);
	private static ContextStat foreignPersonContextStat = new ContextStat(DEFAULT_FOREIGN_PERSON_CONTEXT_STAT);
	private static ContextStat placeContextStat = new ContextStat(DEFAULT_PLACE_CONTEXT_STAT);
	private static ContextStat lexicalContextState = new ContextStat(DEFAULT_LEXICAL_CONTEXT_STAT);
	
	
	public static Dictionary getCoreDict() {
		return coreDict;
	}

	public SegmentResult segment(String text)
	{
		return segment(text, 1);
	}
	
	public SegmentResult segment(String text, int bestN)
	{
		SegmentResult result = new SegmentResult(text);
		
		List<Sentence> sentences = Sentence.normalization(text);
		
		for (Sentence sentence : sentences)
		{
			SegGraph segGraph = sentence.generateSegmentNode(coreDict, relationDict, bestN);
			
			List<AtomicWord> atomicWords = segGraph.getAtomicWords();
			List<List<SegNode>> paths = segGraph.calculateShortPath();
			
			for (List<SegNode> path : paths)
			{
				Adjustment.recognizeNumDateTime(path, atomicWords);
				Adjustment.recognizePersonName(path, atomicWords, personDict, personContextStat);
				Adjustment.recognizeForeignPersonName(path, atomicWords, foreignPersonDict, foreignPersonContextStat);
				Adjustment.recognizePlaceName(path, atomicWords, placeDict, placeContextStat);
				Adjustment.recognizedLexical(path, atomicWords, lexicalContextState);
				Adjustment.finaAdjust(path, atomicWords, placeDict);
				
				result.addSegNodes(path);
			}
		}
		
		return result;
	}
	
	public static void main(String[] args)
	{
		//String words = "周思来与和毛泽东都死于1976年";
		//String words = "许文强生于1943年6月28日,, csdn aa死于1978年末。 ";
		//String words = "他说的确实在理 ";
		//String words = "百分之五点六的人早上八点十八分起床";
		//String words = "克林顿对内塔尼亚胡说 "; 
		//String words = "他从马上摔下来了";
		//String words = "你马上下来一下";
		
		Segment segment = new Segment();
		
		System.out.println(segment.segment("80后"));
		
		System.out.println(segment.segment("周思来与和毛泽东都死于1976年"));
		
		System.out.println(segment.segment("许文强生于1943年6月28日,, csdn aa死于1978年末。"));
		System.out.println(segment.segment("他说的确实在理"));
		System.out.println(segment.segment("百分之五点六的人早上八点十八分起床"));
		System.out.println(segment.segment("克林顿对内塔尼亚胡说"));
		System.out.println(segment.segment("他从马上摔下来了"));
		System.out.println(segment.segment("你马上下来一下"));
		
		System.out.println(segment.segment("一片片树叶"));
		System.out.println(segment.segment("一段段故事"));
		System.out.println(segment.segment("你快去洗洗脸"));
		System.out.println(segment.segment("你快去洗洗澡"));
		System.out.println(segment.segment("你快去睡睡"));
		System.out.println(segment.segment("你快去跑一跑"));
		System.out.println(segment.segment("你从来都是朴朴素素。"));
		
		System.out.println(segment.segment("GG手机"));
		System.out.println(segment.segment("联通手机"));
		
		
		String text = "我是一个80后，外地人，在上海念了4年大学，工作了7年，今年已经是我在上海的第11个年头。有一个小我3岁的女朋友，上海人，她大一刚入学时的那个圣诞节，我们恋爱了。没错，一周之后的圣诞节是我们恋爱8周年纪念日。每年的纪念日我都会为她准备惊喜（当然都是钱砸出来的浪漫），可是今年我真的没有过这个纪念日的心情。" + 
						"我们约定好恋爱10年结婚，只剩2年了。" + 
"我工作7年，几乎没睡过一天安稳觉，没日没夜的工作、应酬、讨好上司。。。终于，工资由最初的一个月5000涨到了一个月1W+，加上年终奖等各种奖，一年大概有15W+。女友刚工作两年，工资还不是很高，基本上马马虎虎够我们的生活开销。这几年下来，我也攒了一点钱，去年看上了上海偏郊区一点的房子，原本打算付了首付，可是女友妈妈嫌弃那个地方太偏，一直在女友耳边叨叨，我们实在没办法，原本我们也没打算那么快结婚，房子那就等几年再买吧，再看看，就放弃了，现在已经涨了不知道有多少了。今年我们又看中了一套房子，在杨浦，这个地理位置女友妈妈勉强同意，但是当我准备付首付的时候，却发现准备的钱根本不够了。无奈，害怕房价越长越高，我只得硬着头皮跟父母开口了，虽然觉得不合适，但是女友很喜欢那套房子。我妈当然不高兴，原本我要在上海定居我家人就反对，觉得离得太远了，现在还没结婚就打算买房，为了付首付还想把为我准备的老婆本儿搭进去，怎么会愿意。一通电话让我跟家里人都有了隔阂。" +
"再说女友。从小在父母的溺爱中长大，大小姐脾气经常，很听父母的话，没怎么吃过苦，喜欢浪漫。问我为什么跟她谈了那么久？因为当她妈妈知道我是外地人，死活不同意我们在一起的时候，她只说了一句话，今生非我不嫁。这也是她出生以来第一次违背父母的意愿。我想不会有哪个男人对这句话有抵抗力。" + 
"于是我们约定了恋爱10年之后结婚。她很懂得怎么讨好我，所以我从来在花钱方面没对她小气过。每年的纪念日我都会重金打造惊喜，一年花的钱比一年多。女友每年都会很高兴，并且一年比一年的期待高，而我就越来越累。。。现在为了房子的事情，跟家里人的关系又不好，女友妈妈一直催我付首付，却丝毫没有想要给我点帮助的意思，尽管我也不稀罕也不奢求。前几天女友吃饭的时候跟我说什么她闺蜜接受她男友的求婚了，在上海市中心买了房。。。当时我就发火了，本来就因为房子不愉快，我就纳闷了，这么多年我到底是在为了什么打拼？为了爱情？还是仅仅是为了一套房子？";
		
		System.out.println(segment.segment(text));
		
		
		coreDict.saveAsText("c:/coreDict.txt");
	}
}
